package com.atguigu.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.entity.UserInfo;
import com.atguigu.result.Result;
import com.atguigu.result.ResultCodeEnum;
import com.atguigu.service.UserInfoService;
import com.atguigu.util.MD5;
import com.atguigu.util.ValidateCodeUtils;
import com.atguigu.vo.LoginVo;
import com.atguigu.vo.RegisterVo;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 杨林
 * @create 2022-09-24 11:52 星期六
 * description:
 */
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {

    @Reference
    private UserInfoService userInfoService;

    /**
     * 实现注册功能
     * @return
     */
    @RequestMapping("/register")
    public Result register(@RequestBody RegisterVo registerVo,HttpServletRequest request){

        //获取前端参数
        String nickName = registerVo.getNickName();
        String code = registerVo.getCode();
        String password = registerVo.getPassword();
        String phone = registerVo.getPhone();

        //对参数进行非空判断
        if (StringUtils.isEmpty(nickName) || StringUtils.isEmpty(code) ||
                StringUtils.isEmpty(password) || StringUtils.isEmpty(phone)){

            return Result.build(null,ResultCodeEnum.PARAM_ERROR);
        }

        //进行验证码校验
        String codeRight = (String)request.getSession().getAttribute("CODE");
        if (!code.equals(codeRight)){  //注意：这里不能使用 == 判断
            //提示验证码不正确
            return Result.build(null,ResultCodeEnum.CODE_ERROR);
        }

        //判断手机号是否被注册
        UserInfo userInfo = userInfoService.getByPhone(phone);
        if (userInfo != null){
            return Result.build(null,ResultCodeEnum.PHONE_REGISTER_ERROR);
        }

        //对用户数据进行封装
        userInfo = new UserInfo();
        userInfo.setNickName(nickName);
        userInfo.setPassword(password);
        userInfo.setPhone(phone);
        userInfo.setStatus(1);

        userInfoService.insert(userInfo);

        return Result.ok();
    }

    @RequestMapping("/sendCode/{phone}")
    public Result getCode(@PathVariable String phone, HttpServletRequest request){
        String code = ValidateCodeUtils.generateValidateCode4String(4);
        //将验证码存入session 用来判断验证码是否正确
        request.getSession().setAttribute("CODE",code);
        return Result.ok(code);
    }


    @RequestMapping("/login")
    public Result login(@RequestBody LoginVo loginVo,HttpServletRequest request){

        String phone = loginVo.getPhone();
        String password = loginVo.getPassword();

        //对数据进行非空校验
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(password)){
            return Result.build(null,ResultCodeEnum.PARAM_ERROR);
        }

        //判断手机号是否在数据库中存在
        UserInfo userInfo = userInfoService.getByPhone(phone);
        if (userInfo == null){
            return Result.build(null,ResultCodeEnum.ACCOUNT_ERROR);
        }

        //判断密码是否正确
        //MD5加密为非对称加密 只能加密 不能解密  因此需要通过比较密文判断密码是否正确
        String passwordNew = MD5.encrypt(password);
        if (!passwordNew.equals(userInfo.getPassword())){
            return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);
        }

        //判断账号是否被锁定
        if (userInfo.getStatus() == 0){
            return Result.build(null,ResultCodeEnum.ACCOUNT_LOCK_ERROR);
        }

        //将userInfo放入到session中
        //登录成功  将用户信息通过Ajax返回  在回调函数进行处理  保存到客户端本地
        //为什么还要将数据保存到服务器的session中
        //比如：关注房源后  获取了houseId  需要从session中获取userId
        request.getSession().setAttribute("USER",userInfo);

        //因为采用的不是Thymeleaf这样的服务器脚本  所以拿不到session中的数据
        //因此  需要通过Ajax返回用户名相关的数据
        //在客户端回调函数中  不可以只显示  还需要保存到本地
        //在注销之前的所有页面都可以从本地获取数据
        Map map = new HashMap<>();
        map.put("nickName", userInfo.getNickName());
        map.put("phone",userInfo.getPhone());
        return Result.ok(map);
    }

    /**
     * 实现注销功能的Controller代码
     */
    @RequestMapping("/logout")
    public Result logout(HttpServletRequest request){

        //删除session中的USER数据
        //request.getSession().removeAttribute("USER");
        //也可以通过直接删除session来实现退出功能
        request.getSession().invalidate();
        return Result.ok();
    }
}